package main

// chan 通道，用于goroutine间数据同步、通信

func main() {
	ch := make(chan int) // 声明并创建通道，通道必须创建才能使用，默认不带缓冲区

	s := []int{1, 2, 3, 4, 5, 5, 6, 7, 8}

	go sum(s, ch)
	go sum(s[1:], ch)
	x, y := <-ch, <-ch //从通道中读取到变量x,y
	println(x, y)

	ch1 := make(chan int, 10) //声明创建通道，并指定缓冲区大小为10，缓冲区可以让处理异步，类似于mq，当缓冲区满了，则发送进通道将会阻塞直到通道有可用缓冲区

	ch1 <- 1
	ch1 <- 2
	print(<-ch1, ",", <-ch1) //读取两个数
	println()

	for i := 0; i < 8; i++ {
		ch1 <- i
	}
	close(ch1) // 关闭通道，只能发送方的调用，会在消费者读取所有当前通道内容之后关闭
	println("=====================")
	// 遍历通道
	for i := range ch1 {
		println(i)
	}

}

func sum(s []int, c chan int) {
	sm := 0
	for _, v := range s {
		sm += v
	}
	c <- sm // 把结果发送到通道
}
